/**
 * DeepSeek AI 服务 - 增强版
 * 支持简单对话（兼容）+ 上下文对话 + 会话管理
 */
import axios from 'axios';
import store from '../store'; // 引入 Vuex store 获取 token
import { ElMessage } from 'element-plus';
import config from '@/config';

// API基础路径
const API_BASE_PATH = '/api/deepseek'

/**
 * 统一错误处理
 */
const handleApiError = (error, defaultMessage = '操作失败') => {
  console.error('DeepSeek API Error:', error)
  let message = defaultMessage
  
  if (error.response) {
    const status = error.response.status
    message = error.response.data?.message || error.response.data?.error || message
    
    if (status === 401) {
      message = '认证失败，请重新登录'
      // 401错误已由全局响应拦截器处理，这里不需要再调用logout
    } else if (status === 403) {
      message = '您没有权限执行此操作'
    }
  }
  
  return { success: false, message, data: null }
}

/**
 * 与 DeepSeek AI 对话（原有方法，保持向下兼容）
 * @param {string} message 用户发送的消息 (text/plain)
 * @returns {Promise<object>} 包含 AI 回复或错误信息的对象 { success: boolean, data: string | null, message: string }
 */
export const chatWithDeepSeek = async (message) => {
  const token = store.state.token; // 从 Vuex state 获取 token

  if (!token) {
    ElMessage.error('用户未登录，无法发送消息');
    return { success: false, data: null, message: '用户未登录' };
  }

  try {
    // 注意：根据文档，Content-Type 是 text/plain，请求体直接是消息文本
    // 但 Axios 默认发送 JSON，我们需要调整配置
    const response = await axios.post(
      // 将路径前缀 '/api' 加入，让请求发到后端 '/api/deepseek/chat'
      config.getFullApiUrl('/api/deepseek/chat'),
      message, // 请求体直接是字符串
      {
        headers: {
          'Authorization': `Bearer ${token}`,
          'Content-Type': 'text/plain' // 明确指定 Content-Type
        },
        // 可以设置一个合理的超时时间，例如 60 秒 (文档提到的超时时间)
        timeout: 60000 
      }
    );

    // 修改成功判断逻辑：
    // 检查 HTTP 状态码是否为 200，并直接使用 response.data 作为返回的文本
    if (response.status === 200 && typeof response.data === 'string') {
      return { success: true, data: response.data, message: '请求成功' };
    } else {
      // 处理非 200 状态码或响应体不是字符串的情况
      const errorMessage = response.data || `请求失败，状态码: ${response.status}`;
      ElMessage.error(errorMessage);
      return { success: false, data: null, message: errorMessage };
    }

  } catch (error) {
    console.error('与 DeepSeek API 通信失败:', error);
    let errorMessage = '与 DeepSeek API 通信失败';
    
    if (error.code === 'ECONNABORTED') {
        errorMessage = '请求 DeepSeek API 超时，请稍后重试';
    } else if (error.response) {
      // 处理 HTTP 错误状态码
      const status = error.response.status;
      const responseBody = error.response.data; // API 返回的错误信息在 body 中
      if (status === 401) {
        errorMessage = responseBody || '认证失败，请重新登录';
        // 401错误已由全局响应拦截器处理，这里不需要再调用logout
      } else if (status === 403) {
        errorMessage = responseBody || '无权访问 DeepSeek API';
      } else if (status === 503) {
          errorMessage = responseBody || 'DeepSeek 服务暂时不可用，请稍后重试';
      } else {
        errorMessage = responseBody || `DeepSeek API 请求错误 (状态码: ${status})`;
      }
    }
    
    ElMessage.error(errorMessage);
    return { success: false, data: null, message: errorMessage };
  }
};

/**
 * 增强版API对象 - 支持会话管理和上下文对话
 */
export const DeepSeekAPI = {
  /**
   * 简单对话（兼容旧版本）
   */
  async chatSimple(message) {
    return await chatWithDeepSeek(message)
  },

  /**
   * 上下文对话（推荐使用）
   */
  async chatWithContext(data) {
    try {
      const response = await axios.post(
        config.getFullApiUrl(`${API_BASE_PATH}/chat-with-context`),
        data,
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`,
            'Content-Type': 'application/json'
          },
          timeout: 60000
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '上下文对话失败')
    }
  },

  /**
   * 获取用户所有会话
   */
  async getUserSessions() {
    try {
      const response = await axios.get(
        config.getFullApiUrl(`${API_BASE_PATH}/sessions`),
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`
          }
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '获取会话列表失败')
    }
  },

  /**
   * 创建新会话
   */
  async createSession(data) {
    try {
      const response = await axios.post(
        config.getFullApiUrl(`${API_BASE_PATH}/sessions`),
        data,
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`,
            'Content-Type': 'application/json'
          }
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '创建会话失败')
    }
  },

  /**
   * 获取会话详情
   */
  async getSessionDetail(sessionId) {
    try {
      const response = await axios.get(
        config.getFullApiUrl(`${API_BASE_PATH}/sessions/${sessionId}`),
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`
          }
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '获取会话详情失败')
    }
  },

  /**
   * 更新会话标题
   */
  async updateSessionTitle(sessionId, title) {
    try {
      console.log('API 参数', { sessionId, newTitle: title })
      const response = await axios.put(
        config.getFullApiUrl(`${API_BASE_PATH}/sessions/${sessionId}/title`),
        { newTitle: title },
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`,
            'Content-Type': 'application/json'
          }
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '更新会话标题失败')
    }
  },

  /**
   * 删除会话
   */
  async deleteSession(sessionId) {
    try {
      const response = await axios.delete(
        config.getFullApiUrl(`${API_BASE_PATH}/sessions/${sessionId}`),
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`
          }
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '删除会话失败')
    }
  },

  /**
   * 归档会话
   */
  async archiveSession(sessionId) {
    try {
      const response = await axios.put(
        config.getFullApiUrl(`${API_BASE_PATH}/sessions/${sessionId}/archive`),
        {},
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`
          }
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '归档会话失败')
    }
  },

  /**
   * 更新会话配置
   */
  async updateSessionConfig(sessionId, config) {
    try {
      const response = await axios.put(
        config.getFullApiUrl(`${API_BASE_PATH}/sessions/${sessionId}/config`),
        config,
        {
          headers: {
            'Authorization': `Bearer ${store.state.token}`,
            'Content-Type': 'application/json'
          }
        }
      )
      return response.data
    } catch (error) {
      return handleApiError(error, '更新会话配置失败')
    }
  }
} 